import org.apache.spark.sql.SparkSession
import org.junit.Test

class 无类型的转换操作 {
  val spark = SparkSession.builder()
    .master("local[6]")
    .appName("Test")
    .getOrCreate()

  import spark.implicits._
  import org.apache.spark.sql.functions._

  /**
    * 选择
    */
  @Test
  def selectTest(): Unit ={
    val ds = Seq(Person("zhangsan", 19), Person("lisi", 30), Person("zhangsan", 19)).toDS()
    ds.select('name).show()
    //使用函数，要导入function包
    ds.selectExpr("sum(age)").show()
  }

  /**
    * 创建新的列
    */
  @Test
  def column(): Unit ={
    val ds = Seq(Person("zhangsan", 19), Person("lisi", 30), Person("zhangsan", 19)).toDS()
    //创建一个新的名叫random的列
    //如果想使用函数的功能  使用function.xx
    //                     使用expr("..")随时随地编写
    ds.withColumn("random",expr("rand()")).show()
    //生成一个列，数据合指定的一样
    ds.withColumn("new_name",'name).show()
    //重命名
    ds.withColumnRenamed("name","new_name").show()
  }

  /**
    * 减除和聚合
    */
  @Test
  def drop_and_groupby(): Unit ={
    val ds = Seq(Person("zhangsan", 19), Person("lisi", 30), Person("zhangsan", 19)).toDS()
    //删除一列
    ds.drop('age).show()
    //groupByKey之所以是有类型的是因为，她所生成的对象中的算子是有类型的
    //groupBy之所以是无类型的是因为他的算子是无类型的,只是针对列来进行处理，不管列的数据类型
    //建议：一般情况下都使用groupBy
    //只要是用到函数都必须调用function包
    ds.groupBy('name).agg(mean('age))
  }
}
